#include "delay.h"

/*在RCC初始化中 系统时钟被设置来自锁相环PLL 64M*/
uint8_t fac_us;
/**
  * @brief 延时函数初始化
  * @param None
  * @retval None
  */
void delay_init(void)
{
	  //前面的时钟初始化 不再这里实现 自行实现
	  RCC_ClocksType clock;
	 	RCC_GetClocksFreqValue(&clock);
	 //printf("SYSTICK is %d",clock.HclkFreq); 调用这个函数查一下你的HCLK配置的频率 来设置滴答1us的计数值
   //HCLK时钟来自与AHB(SYSTICK)分频 也就是系统时钟分配，不分频就是64M最高
	 fac_us = clock.HclkFreq / 1000000; 
	 SysTick->CTRL&=~(1<<2);                   //使用 Cortex 内核时钟
	 SysTick->CTRL |= SysTick_CLKSource_HCLK; //不进行分频
}

/**
  * @brief us级别延时 
  * @param nus 
  * @retval None
  */	    								   
void delay_1us(u32 nus)
{
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; 					//时间加载	  		 
	SysTick->VAL=0x00;        					//清空计数器
	SysTick->CTRL|=1 ;	    //使能计数器  ENABLE位置1
	do
	{
		temp=SysTick->CTRL;
    //检查CTRL的ENABLE位和COUNTFLAG位
    //如果ENABLE位为0或者COUNTFLAG位为1则判断为计数结束 等待时间到达   
	}while((temp&0x01)&&!(temp&(1<<16)));
	SysTick->CTRL&=~1;	    //关闭计数器     ENABLE位置0
	SysTick->VAL =0X00;     //清空计数器	 
}
/**
  * @brief ms级别延时
  * @param nms
  * @retval None
  */
void delay_1ms(u32 nms)
{	 		  	  
	u32 i;
	for(i=0;i<nms;i++) delay_1us(1000);
}
